package com.k.kc.util.base64;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * Base64 编码 解码
 * @author kkk
 */
public class Base64Test {
    public static void main(String[] args) {
        String contentStr="{\"sub\":\"12啊3456气味儿童789看0\",\"name\":\"Tom猫个的12\"}";
        byte[] contentByte = contentStr.getBytes(Charset.forName("utf-8"));
        System.out.println("====Base64:");
        testBase64(contentByte);
        System.out.println("====javautilbase64");
        testJavaUtilBase64(contentByte);
    }
    private static void testBase64(byte[] contentByte){
        // ==================================================================
        // 编码 三种方式
        // Base64.encodeBase64String 常用
        // Base64.encodeBase64URLSafeString 常用
        // Base64.encodeBase64URLSafeStringWithEqual
        // ==================================================================
        // std base64
        String encodeBase64 = Base64.encodeBase64String(contentByte,false);
        System.out.println("encodeBase64:\n"+encodeBase64);

        // std base64基础上 / 替换 _ , + 替换 - ,去掉= . eg:jwt 使用这种
        String encodeBase64URLSafe = Base64.encodeBase64URLSafeString(contentByte);
        System.out.println("encodeBase64URLSafe:\n"+encodeBase64URLSafe);

        // std base64基础上 / 替换 _ , + 替换 -
        String encodeBase64URLSafeWithEqual = Base64.encodeBase64URLSafeStringWithEqual(contentByte);
        System.out.println("encodeBase64URLSafeWithEqual:\n"+encodeBase64URLSafeWithEqual);


        // ==================================================================
        // 解码方式
        // 解码 Base64 不管是 标准Base64 还是 Base64URLSafe 还是 Base64URLSafeWithEqual
        // 都使用 Base64.decodeBase64(encodedString)
        // ==================================================================
        byte[] decodeBase64 = Base64.decodeBase64(encodeBase64);
        System.out.println(new String(decodeBase64,Charset.forName("utf-8")));

        byte[] decodeBase64URLSafe = Base64.decodeBase64(encodeBase64URLSafe);
        System.out.println(new String(decodeBase64URLSafe,Charset.forName("utf-8")));

        byte[] decodeBase64URLSafeWithEqual = Base64.decodeBase64(encodeBase64URLSafeWithEqual);
        System.out.println(new String(decodeBase64URLSafeWithEqual,Charset.forName("utf-8")));

    }

    private static void testJavaUtilBase64(byte[] contentByte){
        String base64_1 = java.util.Base64.getEncoder().encodeToString(contentByte);
        System.out.println(base64_1);
        String base64_2 = java.util.Base64.getUrlEncoder().encodeToString(contentByte);
        System.out.println(base64_2);

        System.out.println(new String(java.util.Base64.getDecoder().decode(base64_1), StandardCharsets.UTF_8));
        System.out.println(new String(java.util.Base64.getUrlDecoder().decode(base64_2),StandardCharsets.UTF_8));
    }
}
